package com.ssy.lingxi.after.sale.service;

import com.ssy.lingxi.common.constant.order.OrderPurchaseProcessTypeEnum;
import com.ssy.lingxi.common.constant.order.OrderTradeProcessTypeEnum;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.contract.api.model.vo.request.ContractExecuteInfoAddVO;
import com.ssy.lingxi.dto.request.SettlementOrderVO;
import com.ssy.lingxi.dto.response.PlatformSettlementAllInPayVO;
import com.ssy.lingxi.logistics.api.dto.response.LogisticsOrderFeignResponse;
import com.ssy.lingxi.marketing.api.model.request.GoodsSalesReq;
import com.ssy.lingxi.member.merchant.api.model.vo.inner.request.MemberFeignAfterSaleCommentVO;
import com.ssy.lingxi.message.api.vo.request.SystemMessageRequest;
import com.ssy.lingxi.order.api.model.vo.request.*;
import com.ssy.lingxi.order.api.model.vo.response.*;
import com.ssy.lingxi.pay.api.dto.request.assetAccount.BalanceRefundRequest;
import com.ssy.lingxi.pay.api.dto.request.eAccount.EAccountRefundRequest;
import com.ssy.lingxi.pay.api.dto.request.eAccount.StoreRefundRequest;
import com.ssy.lingxi.pay.api.model.vo.request.ccb.B2bRefundVO;
import com.ssy.lingxi.pay.api.model.vo.request.ccb.DigitalRefundVO;
import com.ssy.lingxi.pay.api.model.vo.response.allInPay.OrderSplitRefundRespVO;
import com.ssy.lingxi.pay.api.model.vo.response.allInPay.RefundRespVO;
import com.ssy.lingxi.report.api.vo.request.OperateNoticeVO;
import org.springframework.scheduling.annotation.Async;

import java.util.List;
import java.util.Map;

/**
 * 内部接口服务
 * @author 伍将
 * @date 2020/11/21
 * @version 2.0.0
 */
public interface IFeignService {


    /**
     * 发送系统通知
     * @author 伍将
     * @date 2020/12/21
     * @param request:
     **/
    void sendSystemMessage(SystemMessageRequest request);

    /**
     * 发送系统通知
     * @param memberId 会员id
     * @param roleId 角色id
     * @param messageNotice 留言通知
     * @param param 参数
     */
    @Async
    void sendSystemMessage(Long memberId,Long roleId,String messageNotice,String... param);

    /**
     * 更新订单商品明细
     * @author 伍将
     * @date 2020/12/11
     * @param afterSales: 请求参数
     * @return : 操作结果
     **/
    Wrapper<?> orderProductDetailsUpdate(List<OrderAfterSaleVO> afterSales);

    /**
     * 新增会员评价
     * @param commentVO 会员售后评价VO
     */
    void addMemberEvaluate(MemberFeignAfterSaleCommentVO commentVO);

    /**
     * 新增系统操作通知
     * @author 伍将
     * @date 2021/1/9
     * @param noticeVO: 请求参数
     **/
    void addSysOperateNotice(OperateNoticeVO noticeVO);

    /**
     * 根据订单id与商品id，查询订单商品相关信息
     * @param orderProductIds 根据订单id与商品id，
     * @return 订单商品相关信息
     */
    Wrapper<List<OrderAfterSaleProductFeignDetailVO>> afterSalesListById(List<OrderProductIdFeignVO> orderProductIds);
    /**
     * 根据订单ids，查询订单支付记录
     * @param orderIds 订单ids
     * @return 订单支付记录
     */
    Wrapper<List<OrderAfterSalePaymentFeignDetailVO>> getOrderPayInfo(List<Long> orderIds);

    /**
     * 查询采购流程规则
     * @param feignVO 查询采购流程配置接口参数VO
     * @return 采购流程规则
     */
    Wrapper<OrderPurchaseProcessFeignDetailVO> getPurchaseProcess(OrderPurchaseProcessFeignVO feignVO);

    /**
     * 校验采购工作流
     * @param memberId 会员id
     * @param roleId 角色id
     * @param purchaseProcessTypeEnum 购买流程类型枚举
     * @param contractIds 合同id
     */
    void checkPurchaseProcess(Long memberId, Long roleId, OrderPurchaseProcessTypeEnum purchaseProcessTypeEnum, List<Long> contractIds);
    /**
     * 查询交易流程规则
     * @param feignVO 查询交易流程配置接口参数VO
     * @return 交易流程规则
     */
    Wrapper<OrderTradeProcessFeignDetailVO> getTradeProcess(OrderTradeProcessFeignVO feignVO);

    /**
     * 校验交易工作流
     * @param memberId 会员id
     * @param roleId 角色id
     * @param tradeProcessTypeEnum 交易流程类型枚举
     * @param skuIds skuIdS
     * @param shopId 店铺编号
     */
    void checkTradeProcess(Long memberId, Long roleId, OrderTradeProcessTypeEnum tradeProcessTypeEnum, List<Long> skuIds, Long shopId);
    /**
     * 查询物流单信息
     * @param logisticsId 物流编号
     * @return 物流单信息
     */
    Wrapper<LogisticsOrderFeignResponse> getLogisticsOrder(Long logisticsId);

    /**
     * 批量查询物流单信息
     * @param logisticsIds 物流编号集合
     * @return 物流单信息
     */
    Wrapper<List<LogisticsOrderFeignResponse>> listLogisticsOrder(List<Long> logisticsIds);
    /**
     * 批量查询物流单信息
     * @param logisticsIds 物流编号集合
     * @return Map 物流单信息
     */
    Map<Long,LogisticsOrderFeignResponse> listLogisticsOrderMap(List<Long> logisticsIds);

    /**
     * 查询订单是否需要开票.
     * @param orderNo 订单编码
     * @return 订单是否需要开票
     */
    Wrapper<OrderSettleAccountInvoiceFeignDetailVO> findSettleAccountInvoiceDetail(String orderNo);

    /**
     * 更新活动商品销量与会员已购数.
     * @param req 活动商品销量更新
     * @return 更新活动商品销量与会员已购数
     */
    Wrapper<?> updateActivitySkuSales(GoodsSalesReq req);

    /**
     * 支付宝退款
     * @param memberId 会员id
     * @param roleId 角色id
     * @param transactionPayId 交易支付 ID
     * @param orderNo 订单编码
     * @param refundNo 退款编码
     * @param payRuleId 支付角色id
     * @param refundAmount 退款金额
     * @return 支付宝退款结果
     */
    Wrapper<Object> refundByAliPay(Long memberId,Long roleId,String transactionPayId,String orderNo,String refundNo,Integer payRuleId,Double refundAmount);

    /**
     * 微信退款
     * @param memberId 会员id
     * @param roleId 角色id
     * @param transactionPayId 交易支付 ID
     * @param orderNo 订单编码
     * @param refundNo 退款编码
     * @param payAmount 支付金额
     * @param payRuleId 支付角色id
     * @param refundAmount 退款金额
     * @return 微信退款结果
     */
    Wrapper<Object> refundByWeChatPay(Long memberId,Long roleId,String transactionPayId,String orderNo,String refundNo,Double payAmount,Integer payRuleId,Double refundAmount);

    /**
     * 批量添加合同执行信息
     * @param contractExecuteList 合同执行情况新增VO集合
     * @return 批量添加合同执行信息结果
     */
    Wrapper<?> addContractExecuteInfoList(List<ContractExecuteInfoAddVO> contractExecuteList);

    /**
     * 通联支付退款-退款申请(1-会员直接到账; 2-平台代收并且平台还没结算给商家)
     * @param request 退款请求数据
     * @return 退款结果
     */
    Wrapper<RefundRespVO> refundByDirectAccount(EAccountRefundRequest request);

    /**
     * 通联支付退款-退款申请(平台代收并且平台已经结算给商家)
     * @param request 退款请求数据
     * @return 退款结果
     */
    Wrapper<OrderSplitRefundRespVO> refundByPlatformExchange(StoreRefundRequest request);

    /**
     * 售后服务 - 订单会员信息校验
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Boolean> checkAfterSaleOrderMember(CheckOrderMemberAfterSaleVO request);

    /**
     * 售后服务 - 订单使用平台优惠券信息查询
     * @param request
     * @return
     */
    Wrapper<List<OrderProductCouponFeignVO>> findOrderProductCouponAmounts(OrderFeignIdsVO request);
    /**
     * 结算服务 - 根据支付记录获取平台结算单的支付号
     * @param payId 支付记录id
     * @return 平台结算单的支付号
     */
    Wrapper<PlatformSettlementAllInPayVO> getPlatformSettlementByDetailPaymentId(Long payId);

    /**
     * 建行支付退款
     * @param vo
     * @return
     */
    Wrapper<Boolean> refundByCcbPay(B2bRefundVO vo);

    /**
     * 建行数字货币退款
     * @param vo
     * @return
     */
    Wrapper<Boolean> refundByCcbDigitalPay(DigitalRefundVO vo);

    /**
     * 余额退款
     * @param refundRequest
     * @return
     */
    Wrapper<Boolean> balanceRefund(BalanceRefundRequest refundRequest);

    /**
     * srm订单退货，通知结算服务（mq）
     * @param orderVO
     */
    void notifySrmReturnSettlement(SettlementOrderVO orderVO);

    /**
     * 使用平台优惠券的订单退货，通知结算服务
     * @param type
     * @param message
     */
    void sendMsgToSettleAccountMQ(Integer type, String message);
}
